package com.oop.example.work.bel;

import com.oop.example.processing.Reader;
import java.io.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;

/**
 * На вход должны поступать данные фомата
 *
 * @author -
 */
public class HtmlReader implements Reader {

    private Properties labelDictionary;
    private String encoding = "UTF-8";

    public HtmlReader(String encoding) {
        this.encoding = encoding;
        labelDictionary = Utils.getLabelDictionary();
    }

    @Override
    public String[] read(File file) {
        ArrayList<String> out = new ArrayList<String>();
        try {
            // Open the file that is the first
            // command line parameter
            FileInputStream fstream = new FileInputStream(file);
            // Get the object of DataInputStream
            DataInputStream in = new DataInputStream(fstream);
            BufferedReader br = new BufferedReader(new InputStreamReader(in, encoding));
            String strLine;
            String fullLine = "";
            boolean inContext = false;
            while ((strLine = br.readLine()) != null) {

                if (strLine.startsWith("<p")) {
                    fullLine = strLine;
                    inContext = true;//вошли в тег <p>
                    if (strLine.endsWith("</p>")) {
                        fullLine = cleanLine(fullLine).trim();
                        out.add(fullLine);
                        fullLine = "";
                        inContext = false;//вышли из тега </p>
                    }
                } else if (strLine.endsWith("</p>")) {
                    fullLine += " " + strLine;
                    fullLine = cleanLine(fullLine).trim();
                    out.add(fullLine);
                    fullLine = "";
                    inContext = false;//вышли из тега </p>
                } else {
                    if (inContext) {
                        fullLine += " " + strLine;
                    }
                }
            }
            in.close();
        } catch (Exception e) {//Catch exception if any
            e.printStackTrace(System.out);
        }
        return out.toArray(new String[]{});
    }

    private static String cleanLine(String str) {
        String src = str;
        String commonChars = "[= a-zA-Z0-9-\\:\\'\\.\\;\"\\,]*";
        //Преобразуем в xml и удаляем все атрибуты
        src = src.replaceAll("<p class=" + commonChars + ">", "<p>");
        src = src.replaceAll("<b (style|lang)=" + commonChars + ">", "<b>");
        src = src.replaceAll("<span (class|style|lang)=" + commonChars + ">", "<span>");
        src = src.replaceAll("<i (style|lang)=" + commonChars + ">", "<i>");


        Map<String, String> map = new HashMap<String, String>();
        map.put("&#61448;", "&#769;");//причесываем ударения
        map.put("&#61449;", "&#769;");//причесываем ударения
        map.put("&#769;&#769;", "&#769;");//причесываем ударения
        map.put("</b>&#769;<b>", "&#769;");//причесываем ударения
        map.put("<b>&#769;</b>", "&#769;");//причесываем ударения
        map.put("</i>&#769;<i>", "&#769;");//причесываем ударения
        map.put("<i>&#769;</i>", "&#769;");//причесываем ударения
        map.put("</b><b>", "");//объединение нескольких <b>
        map.put("</i><i>", "");//объединение нескольких <i>
        map.put("<o:p></o:p>", "");//лишнее
        map.put("<span>", "");//лишнее
        map.put("</span>", "");//лишнее
        map.put("<br>", "");//лишнее
        map.put("<br/>", "");//лишнее
        map.put("</b>&#769;", "&#769;</b>");//возвращает "потерянные в хвосте" ударения
        map.put("  ", " ");//Пробелы двойные
        map.put("</b>, <b>", ", ");
        map.put("<u>", "");
        map.put("</u>", "");
        map.put("</i>\\)", ")</i>");
        map.put("\\(<i>", "<i>(");
        map.put("</i>\\.", ".</i>");
        map.put("</i> <i>", " ");
        map.put("</i><b>,</b> <i>", ", ");
        map.put("</i>&amp;", "&amp;</i>");
        map.put("&amp;<i>", "<i>&amp;");
        
        
        boolean exit = false;
        while (!exit) {
            exit = true;
            for (String key : map.keySet()) {
                String cont = key.replace("\\", "");
                if (src.contains(cont)) {
                    src = src.replaceAll(key, map.get(key));
                    exit = false;
                    break;
                }
            }
        }
        return src;
    }
    
    public static void main(String[] args) {
        String str = "<p><b>абрико&#769;с</b> (<i>плод</i>) абрыко&#769;с<b>,@</b> -са <i>м</i>.</p>";
        System.out.println(cleanLine(str));        
    }
}
